"""
装饰器
    本质是一个闭包: 内层函数调动外层函数的参数

    作用: 在不改变原有函数调用的情况下,给函数增加新的功能

"""

def guanjia(fn):
    def inner(*args, **kwargs):
        print("1打开辅助")
        ret = fn(*args, **kwargs)
        print('1关闭辅助')
        return ret
    return inner

def guanjia2(fn):
    def inner(*args, **kwargs):
        print("2打开辅助")
        ret = fn(*args, **kwargs)
        print('2关闭辅助')
        return ret
    return inner
def play_cs():
    print("打cs")

@guanjia   # 装饰器 相当于play_lol = guanjia(play_lol)
@guanjia2  # 装饰器 相当于play_lol = guanjia(play_lol)
def play_lol():
    print("打lol")

play_cs = guanjia(play_cs)

# play_cs()

# play_lol()


has_login = False
def login_valid(fn):
    def inner(*args, **kwargs):
        global has_login
        if not has_login:
            print('请先登录')
            while True:
                username = input('请输入用户名')
                password = input('请输入密码')
                if username == 'admin' and password == '123456':
                    has_login = True
                    break
                else:
                    print('用户名或密码有误')
        else :
             print('已登录')
        ret = fn(*args, **kwargs)
        return ret
    return inner

@login_valid
def add() :
    print('添加')

@login_valid
def delete() :
    print('删除')

@login_valid
def update() :
    print('更新')

add()
delete()